#include <iostream>
#include <vector>

class Person {
public:
    int number; // 人的编号
    Person(int num) : number(num) {} // 构造函数
};

class Josephus {
private:
    std::vector<Person*> people; // 存储所有人的向量
    int k; // 报数上限

public:
    // 构造函数，初始化人数和报数上限
    Josephus(int n, int m) : k(m) {
        for (int i = 1; i <= n; ++i) {
            people.push_back(new Person(i)); // 创建新的Person对象并加入向量
        }
    }

    // 析构函数，释放内存
    ~Josephus() {
        for (Person* p : people) {
            delete p; // 删除Person对象
        }
    }

    // 找到最后剩下的人的编号
    int findLastRemaining() {
        int index = 0; // 当前报数的人的索引
        while (people.size() > 1) { // 当不止一个人时继续游戏
            index = (index + k - 1) % people.size(); // 计算要删除的人的索引
            people.erase(people.begin() + index); // 删除该人
        }
        return people[0]->number; // 返回最后剩下的人的编号
    }
};

int main() {
    int n = 50; // 总人数
    int k = 23; // 报数上限
    Josephus josephus(n, k); // 创建Josephus对象
    std::cout << "The last person standing is person number: " << josephus.findLastRemaining() << std::endl;
    return 0;
}